def fun(*args):
    """个数可变的位置参数"""
    print(args)


fun(10)
fun(10, 30)
fun(30, 405)


def fun1(**args):
    """个数可变的关键字参数"""
    print(args, type(args))


fun1(a=10)
fun1(a=20, b=30, c=40)

print('------------------------------')


# def fun2(*args,*a)  # error 个数可变的位置参数 只能定义一个

# def fun3(**args, **a)  # error 个数可变的关键字参数 只能有1个

def fun4(*args, **kwargs):
    pass


# def func5(**kwargs, *args)  # error 位置参数必须在前


def func5(a, *args):
    pass


def func6(a, *args, **kwargs):
    print(a, args, kwargs)
    print(type(args), type(kwargs))


func6(10, 20, b=30)
func6(b=30, a=20, d=50)


def func7(a, b, c):
    pass


lst = [11, 22, 33]
# *lst 将列表的每个元素都转换为位置实参传入
func7(*lst)
# print(type(*lst))  # error

dic = {'a': 111, 'b': 222, 'c': 333}
# **dic 将字典中的键值对都转换为关键字实参传入
func7(**dic)
# print(type(**dic))  # error

print("--------------------")


def func8(a, b, *, c, d):
    """从*之后的参数，在函数调用时，只能采用关键字参数传递"""
    pass


func8(10, 20, c=30, d=40)
